CEDEC2015 Day2 メモとか


概要

メモ



GPGPUを活用した剛体シミュレーション最適化事例


GPUが得意なこと

特殊効果的なやつ

物量で賑やかな画面を演出する


精度はそこそこなんだけど大量。



拘束ソルバーって何

衝突検出、反発力計算、移動

Collision Detection, Constraint Solver, Integration


これのConstraint Solverのところ。


A,B,Cの三つの物体がぶつかる時、A-B,B-C,C-A間で、全ての物体同士が貫通しない、というような三つの拘束に対しての解が欲しい

ヤコビ法ガウズザイデル法とかで解ける。ただし不等式がふくまれるので、一意にならない。ので、反復解法というのを使う


解決条件を満たしている解λを0~無限の範囲でクランプ(保持?)

0に近い値を望む。

拘束式

CEDEC 2008 物理エンジンの作り方

というのがあるのでみよう。

ヤコビアン:変換マトリクス。速度を拘束軸上に変換する。

拘束軸上?:衝突ポイント上に存在するベクトルみたいなものぽい


式の名前かな


ガウスザイデル法を高速に解く

A-B

B-C

A - C

C-D


同じ剛体を共有しないものは個別に計算できる。


で。


ヤコビ法について、

並列にできる部分を上記のようにみなす方法をつかってみたところ、あんまりよくなかった。

・並列性の悪化

・並列化のためのコストがあった。。


なんで?

計算内容とその反映タイミングの問題。

・ガウズザイデル法だと結果が収束する

・ヤコビ法だと結果が発散する


なので、

・ペア同士の計算はザイデル

・ペア全体の計算はヤコビ

と振ることで、計算量の削減をはかりつつ、、みたいな話


ヤコビ法について

SOR

SUR

SURを適応するとデルタが小さくなって解が発散しにくくなる(解が定まりやすくなる


Weightみたいなパラメータを追加してSURとして適応する

出し方いろいろ。とりあえずインデクシングしまくるみたいなかんじ。


Biasの追加

めりこんだぶんを速度に加える。

貫通してる方向と深さに対して反発力を追加する、みたいな話


反復回数少なくてもいいかんじに動く、みたいなのが目標。


結論

・ガウスザイデル法より修正を加えたヤコビ速くて軽い

・物量が増えてくるとだんだん同じような結果を出す感じになる

・ただ量が増えてくるとメモリアクセスやらで減速する



メモリアクセス周り

流体、粒子ベースシミュレーションで得られた知見

メモリアクセスの効率化


データ構造の変換による効率改善

Array of struct

Struct of array


AOS:

{

pos

vel

}


SOR:

{

pos[N]

vel[N]

}


SOAのほうがキャッシュヒット率良いよ(無駄なデータを読まないので


空間充填曲線をつかってメモリアクセス局在性の最適化

「もし座標上近い物体が隣接したメモリポイントに存在すれば、キャッシュヒット改善するんじゃね?」


テクスチャのピクセル配置に対して、

swizzle化という処理を行うことで、テクスチャ座標上で近いテクスチャのポインタがそれぞれ隣接するといいなみたいな。


空間充填曲線

Z曲線

ヒルベルト曲線とか


「スクリーン座標上でも近いピクセルは、テクスチャ上でも近い、みたいな法則を利用する。」


モートンコード

・低コストで扱える空間充填曲線


メモリをソートした結果、3~4倍の高速化

ソートにかかる処理の重さに比べて圧倒的に高速化のメリットが出る


なるほどな~~


モートンコードのコードはなんかサンプル見よう。

hash gridとも相性がいい



ありあまる演算資源をどのように使い切るか

そうだAsyncShader使おうみたいな話



サブディビジョンサーフェスのすべてがわかる・グラフィックスエンジニア向け理論編


資料発表が発表終了直後だったのでありがたくよみかえしている。

http://takahito-tejima.github.io